//package com.gy.handler;
//
//import cn.hutool.core.collection.CollUtil;
//import cn.hutool.json.JSONUtil;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import com.fasterxml.jackson.databind.module.SimpleModule;
//import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
//import com.gy.entity.Form.FormEntity;
//import com.gy.entity.User;
//import com.gy.enumeration.FormEditActionEnum;
//import com.gy.enumeration.FormEditMessageTypeEnum;
//import com.gy.message.FormEditRequestMessage;
//import com.gy.message.FormEditResponseMessage;
//
//import com.gy.service.FormService;
//import com.gy.service.UserService;
//import com.gy.vo.form.AddMemberVO;
//import lombok.extern.slf4j.Slf4j;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.stereotype.Component;
//import org.springframework.web.socket.CloseStatus;
//import org.springframework.web.socket.TextMessage;
//import org.springframework.web.socket.WebSocketSession;
//import org.springframework.web.socket.handler.TextWebSocketHandler;
//
//import javax.annotation.Resource;
//import java.io.IOException;
//import java.util.Map;
//import java.util.Set;
//import java.util.concurrent.ConcurrentHashMap;
//
//@Component
//public class FormEditHandler extends TextWebSocketHandler {
//    @Resource
//    private UserService userService;
//    @Resource
//    private FormService formService;
//
//    @Resource
//    private FormEditEventProducer formEditEventProducer;
//
//    // 每个空间的编辑状态，key: formId, value: 当前正在编辑的用户 ID
//    private final Map<Long, Long> formEditingUsers = new ConcurrentHashMap<>();
//
//    // 保存所有连接的会话，key: formId, value: 用户会话集合
//    private final Map<Long, Set<WebSocketSession>> formSessions = new ConcurrentHashMap<>();
//
//
//    @Override
//    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
//        // 将消息解析为 PictureEditMessage
//        FormEditRequestMessage pictureEditRequestMessage = JSONUtil.toBean(message.getPayload(), FormEditRequestMessage.class);
//        // 从 Session 属性中获取公共参数
//        Map<String, Object> attributes = session.getAttributes();
//        User user = (User) attributes.get("user");
//        Long formId = (Long) attributes.get("formId");
//        // 生产消息
//        formEditEventProducer.publishEvent(pictureEditRequestMessage, session, user, formId);
//    }
//
//    /**
//     * 退出编辑状态
//     *
//     * @param formEditRequestMessage
//     * @param session
//     * @param user
//     * @param formId
//     */
//    public void handleExitEditMessage(FormEditRequestMessage formEditRequestMessage, WebSocketSession session, User user, Long formId) throws Exception {
//        // 正在编辑的用户
//        Long editingUserId = formEditingUsers.get(formId);
//        // 确认是当前的编辑者
//        if (editingUserId != null && editingUserId.equals(user.getUserId())) {
//            // 移除用户正在编辑该图片
//            formEditingUsers.remove(formId);
//            // 构造响应，发送退出编辑的消息通知
//            FormEditResponseMessage formEditResponseMessage = new FormEditResponseMessage();
//            formEditResponseMessage.setType(FormEditMessageTypeEnum.EXIT_EDIT.getValue());
//            String message = String.format("用户 %s 退出编辑表单", user.getUserName());
//            formEditResponseMessage.setMessage(message);
//
//            broadcastToPicture(formId, formEditResponseMessage);
//        }
//    }
//
//    /**
//     * 进入编辑状态
//     *
//     * @param formEditRequestMessage
//     * @param session
//     * @param user
//     * @param formId
//     */
//    public void handleEnterEditMessage(FormEditRequestMessage formEditRequestMessage, WebSocketSession session, User user, Long formId) throws Exception {
//
//        // 检查是否已有其他用户正在编辑
//        if (!formEditingUsers.containsKey(formId)) {
//            // 设置该用户为正在编辑的用户
//            formEditingUsers.put(formId, user.getUserId());
//            FormEditResponseMessage responseMessage = new FormEditResponseMessage();
//            responseMessage.setType(FormEditMessageTypeEnum.ENTER_EDIT.getValue());
//            String message = String.format("用户 %s 开始编辑表单", user.getUserName());
//            responseMessage.setMessage(message);
//            responseMessage.setUserId(user.getUserId());
//            broadcastToPicture(formId, responseMessage);
//        } else {
//            // 如果已经有用户在编辑该表单，拒绝该用户的编辑请求并提示
//            FormEditResponseMessage responseMessage = new FormEditResponseMessage();
//            responseMessage.setType(FormEditMessageTypeEnum.INFO.getValue());
//            String message = String.format("用户 %s 已经在编辑该表单，您只能查看", user.getUserName());
//            responseMessage.setMessage(message);
//            responseMessage.setUserId(user.getUserId());
//            session.sendMessage(new TextMessage(JSONUtil.toJsonStr(responseMessage)));
//        }
//    }
//
//
//    /**
//     * 处理编辑操作
//     *
//     * @param formEditRequestMessage
//     * @param session
//     * @param user
//     * @param formId
//     */
//    public void handleEditActionMessage(FormEditRequestMessage formEditRequestMessage, WebSocketSession session, User user, Long formId) throws Exception {
//        // 获取当前正在编辑该表单的用户
//        Long editingUserId = formEditingUsers.get(formId);
//        String editAction = formEditRequestMessage.getEditAction();
//
//        // 确认当前用户是否是正在编辑该表单的用户
//        if (editingUserId != null && editingUserId.equals(user.getUserId())) {
//            FormEditResponseMessage responseMessage = new FormEditResponseMessage();
//            responseMessage.setType(FormEditMessageTypeEnum.EDIT_ACTION.getValue());
//            String message = String.format("%s 执行了编辑操作: %s", user.getUserName(), "更新操作");
//            responseMessage.setMessage(message);
//            responseMessage.setEditAction(editAction);
//            responseMessage.setUserId(user.getUserId());
//
//            FormEntity formEntity = new FormEntity();
//            formEntity.setId(formId);
//
//            // 提取 formData 字符串
//            String formData = extractFormData(editAction);
//            formEntity.setFormData(formData);
//
//            // 更新表单内容
//            formService.updateFromById(formEntity);
//
//            // 将编辑操作广播给其他用户，避免重复编辑
//            broadcastToPicture(formId, responseMessage, session);  // 这里排除掉当前发起操作的用户 session
//        }
//    }
//
//
//    /**
//     * 从 editAction 字符串中提取 formData
//     *
//     * @param editAction 包含 formData 的 JSON 字符串
//     * @return 提取的 formData 字符串
//     */
//    private String extractFormData(String editAction) {
//        // 找到 "value" 的位置
//        int startIndex = editAction.indexOf("\"value\":") + "\"value\":".length();
//        // 跳过可能存在的空格
//        while (startIndex < editAction.length() && Character.isWhitespace(editAction.charAt(startIndex))) {
//            startIndex++;
//        }
//        // 检查是否是 JSON 对象的开始
//        if (editAction.charAt(startIndex) == '{') {
//            // 找到匹配的结束大括号
//            int openBraces = 1;
//            int endIndex = startIndex + 1;
//            while (endIndex < editAction.length() && openBraces > 0) {
//                if (editAction.charAt(endIndex) == '{') {
//                    openBraces++;
//                } else if (editAction.charAt(endIndex) == '}') {
//                    openBraces--;
//                }
//                endIndex++;
//            }
//            // 提取 "value" 对应的 JSON 字符串
//            String formData = editAction.substring(startIndex, endIndex);
//            return formData;
//        } else {
//            // 如果 "value" 后面不是 JSON 对象，返回空字符串或其他默认值
//            return "";
//        }
//    }
//
//
//
//
//    /**
//     * 关闭连接
//     *
//     * @param session
//     * @throws Exception
//     */
//    @Override
//    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
//        super.afterConnectionEstablished(session);
//        // 保存会话到集合中
//        User user = (User) session.getAttributes().get("user");
//        Long formId = (Long) session.getAttributes().get("formId");
//        formSessions.putIfAbsent(formId, ConcurrentHashMap.newKeySet());
//        formSessions.get(formId).add(session);
//
//        // 检查当前表单是否有人正在编辑
//        Long editingUserId = formEditingUsers.get(formId);
//        if (editingUserId != null) {
//            // 如果有人正在编辑，发送编辑状态消息
//            AddMemberVO editingUser = userService.getUserPersonalInfo(editingUserId);
//            FormEditResponseMessage responseMessage = new FormEditResponseMessage();
//            responseMessage.setType(FormEditMessageTypeEnum.ENTER_EDIT.getValue());
//            String message = String.format("用户 %s 正在编辑表单", editingUser.getNickName());
//            responseMessage.setMessage(message);
//            responseMessage.setUserId(editingUserId);
//            session.sendMessage(new TextMessage(JSONUtil.toJsonStr(responseMessage)));
//        }
//
//        // 广播用户加入编辑的消息
//        FormEditResponseMessage joinMessage = new FormEditResponseMessage();
//        joinMessage.setType(FormEditMessageTypeEnum.INFO.getValue());
//        String message = String.format("%s加入编辑", user.getUserName());
//        joinMessage.setMessage(message);
//        joinMessage.setUserId(user.getUserId());
//        broadcastToPicture(formId, joinMessage);
//    }
//    /**
//     * 广播给该图片的所有用户（支持排除掉某个 Session）
//     *
//     * @param formId
//     * @param formEditResponseMessage
//     * @param excludeSession
//     */
//    private void broadcastToPicture(Long formId, FormEditResponseMessage formEditResponseMessage, WebSocketSession excludeSession) throws Exception {
//        Set<WebSocketSession> sessionSet = formSessions.get(formId);
//        if (CollUtil.isNotEmpty(sessionSet)) {
//            // 创建 ObjectMapper
//            ObjectMapper objectMapper = new ObjectMapper();
//            // 配置序列化：将 Long 类型转为 String，解决丢失精度问题
//            SimpleModule module = new SimpleModule();
//            module.addSerializer(Long.class, ToStringSerializer.instance);
//            module.addSerializer(Long.TYPE, ToStringSerializer.instance); // 支持 long 基本类型
//            objectMapper.registerModule(module);
//            // 序列化为 JSON 字符串
//            String message = objectMapper.writeValueAsString(formEditResponseMessage);
//            TextMessage textMessage = new TextMessage(message);
//            for (WebSocketSession session : sessionSet) {
//                // 排除掉的 session 不发送
//                if (excludeSession != null && excludeSession.equals(session)) {
//                    continue;
//                }
//                if (session.isOpen()) {
//                    session.sendMessage(textMessage);
//                }
//            }
//        }
//    }
//
//    /**
//     * 广播给该图片的所有用户
//     *
//     * @param formId
//     * @param formEditResponseMessage
//     */
//    private void broadcastToPicture(Long formId, FormEditResponseMessage formEditResponseMessage) throws Exception {
//        broadcastToPicture(formId, formEditResponseMessage, null);
//    }
//
//}
